package v1

import (
	"RoccBlog/api"
	"RoccBlog/global"
	"RoccBlog/model/req_resp"
	"RoccBlog/service/v1"
	"github.com/gin-gonic/gin"
	"strconv"
)

type UserController struct {
	api.BaseController
	api.BaseOperationController
	Service *v1.UserService
}

func init() {
	// 注册到容器中
	global.RegisterController(&UserController{})
}

func (c *UserController) RegisterController(engine *gin.RouterGroup) {

	// 配置server
	c.Service = global.GetService(v1.UserService{}).(*v1.UserService)

	g := engine.Group("/user")
	{
		g.POST("", c.Add)
		g.DELETE("", c.Remove)
		g.PUT("", c.Modify)
		g.GET("/list", c.Find)
		g.GET("", c.FindById)
		g.GET("/resetPassword", c.ResetPassword)
	}
}

// Add
// @Tags 用户管理
// @Summary 添加用户
// @Produce  json
// @Param user body req_resp.AddUserReq false "用户"
// @Success 200 {object} api.Result "成功"
// @Router /user [post]
func (c *UserController) Add(ctx *gin.Context) {
	var user req_resp.LoginUserReq
	err := ctx.ShouldBind(&user)
	if err != nil {
		c.ResponseBadRequest(ctx)
		return
	}
	err = c.Service.Add(ctx, user)
	c.HandleResponseNoResult(ctx, err, "创建用户失败", "创建用户成功")
}

// Remove
// @Tags 用户管理
// @Summary 删除用户
// @Produce  json
// @Param id query int required "用户ID"
// @Success 200 {object} api.Result "成功"
// @Router /user [delete]
func (c *UserController) Remove(ctx *gin.Context) {
	id, err := strconv.Atoi(ctx.Query("id"))
	if err != nil {
		c.ResponseBadRequest(ctx)
		return
	}
	err = c.Service.Remove(ctx, id)
	c.HandleResponseNoResult(ctx, err, "删除用户数失败！", "删除用户成功")
}

// Modify
// @Tags 用户管理
// @Summary 修改用户
// @Produce  json
// @Param user body req_resp.ModifyUserReq required "用户"
// @Success 200 {object} api.Result "成功"
// @Router /user [put]
func (c *UserController) Modify(ctx *gin.Context) {
	var user req_resp.ModifyUserReq
	err := ctx.ShouldBind(&user)
	if err != nil {
		c.ResponseBadRequest(ctx)
		return
	}
	err = c.Service.Modify(ctx, user)
	c.HandleResponseNoResult(ctx, err, "修改用户失败", "修改用户成功")
}

// Find
// @Tags 用户管理
// @Summary 查找用户
// @Produce  json
// @Param user query req_resp.UserQueryReq false "查询条件"
// @Param pageNum query int false "页码"
// @Param pageSize query int false "每页数量"
// @Success 200 {object} api.Result "成功"
// @Router /user/list [get]
func (c *UserController) Find(ctx *gin.Context) {
	var query req_resp.UserQueryReq

	err := ctx.ShouldBindQuery(&query)
	if err != nil {
		c.ResponseBadRequest(ctx)
		return
	}

	list, err := c.Service.Find(ctx, query)
	c.HandleResponseResult(ctx, err, "查询列表失败！", list)
}

// FindById
// @Tags 用户管理
// @Summary 查找用户ById
// @Produce  json
// @Param id query int false "用户id"
// @Success 200 {object} api.Result "成功"
// @Router /user [get]
func (c *UserController) FindById(ctx *gin.Context) {
	id, err := strconv.Atoi(ctx.Query("id"))
	if err != nil {
		c.ResponseBadRequest(ctx)
		return
	}
	user, err := c.Service.FindById(ctx, id)
	c.HandleResponseResult(ctx, err, "查询用户失败！", user)
}

// ResetPassword
// @Tags 用户管理
// @Summary 重置密码
// @Produce  json
// @Param id query int true "用户id"
// @Success 200 {object} api.Result "成功"
// @Router /user/resetPassword [get]
func (c *UserController) ResetPassword(ctx *gin.Context) {
	id, err := strconv.Atoi(ctx.Query("id"))
	if err != nil {
		c.ResponseBadRequest(ctx)
		return
	}

	err = c.Service.ResetPassword(ctx, id)
	c.HandleResponseNoResult(ctx, err, "重置密码失败", "重置密码成功")
}
